New transaction event, bugfixes and more! | This Week in Rails
ActiveRecordに関する変更です
まずは前提として Active Support Instrumentation について説明します
Active Supportに含まれているInstrumentation APIは、Rubyコードで発生する特定の動作の計測に利用できます。Railsアプリケーション内部やフレームワーク自身の計測はもちろん、必要であればRails以外のRubyスクリプトなども測定できます。
(中略)
Active Supportが提供するInstrumentation APIを使ってフックを開発すると、他の開発者がそこにフックできるようになります。Railsフレームワーク内部にはさまざまなフックが用意されています。
(中略)
たとえばActive Recordには、データベースへのSQLクエリが発行されるたびに呼び出されるフックが用意されています。このフックをサブスクライブ(購読)すると、特定のアクションでのクエリ実行数を追跡できます。
フックをサブスクライブする方法についても記載があります
イベントは簡単にサブスクライブできます。ActiveSupport::Notifications.subscribeをブロック付きで記述すれば、すべての通知をリッスンできます。
code:rb
ActiveSupport::Notifications.subscribe "process_action.action_controller" do |event|
event.name # => "process_action.action_controller"
event.duration # => 10 (in milliseconds)
event.payload # => {:extra=>information}
Rails.logger.INFO:"#{event} Received!"
end
この例の process_action.action_controller イベントは、コントローラのアクションを処理したイベントです
payload には、コントローラ名、アクション名、リクエストヘッダー、リクエストパラメータ、レスポンスオブジェクト、HTTPステータスコード、ビューでかかった合計時間、データベースへのクエリ実行にかかった時間、など、リクエストとレスポンスに関する情報が含まれています
詳しくはRailsガイドを参照してください
さて、今回のプルリクエストでは、Instrumentation APIをつかって新しいイベントのフックが実装されています
具体的には start_transaction.active_record というイベントです
このイベントフックはActiveRecordのトランザクションが開始されたときに呼び出されます
類似するイベントとしては transaction.active_record というイベントのフックはすでにありました
しかしこれはトランザクションが終了したときに呼び出されるため、トランザクションの開始イベントを購読することはできません
今回のプルリクエストにより、トランザクションの開始イベントを購読できるようになったため、トランザクションと開始と終了を両方とも購読できる状態になりました
ActiveRecordに関する変更です
ActiveRecord::QueryMethodsに in_order_of というメソッドがあります
第一引数に指定されたカラムを、第二引数の配列に指定された値たちでフィルターしたうえで、その配列の要素の順番でソートする、というメソッドです
code:rb
# SELECT "users".* FROM "users"
# WHERE "users"."id" IN (1, 5, 3)
# ORDER BY CASE
# WHEN "users"."id" = 1 THEN 1
# WHEN "users"."id" = 5 THEN 2
# WHEN "users"."id" = 3 THEN 3
# END ASC
今回のプルリクエストでは、オプショナルな引数として filter が追加されました
第二引数の配列に指定された値たちでフィルターするかどうかを指定するbooleanで、デフォルト値は true です
先程の例で filter: false を指定すると次のようになります
code:rb
User.in_order_of(:id, 1, 5, 3, filter: false) # SELECT "users".* FROM "users"
# ORDER BY CASE
# WHEN "users"."id" = 1 THEN 1
# WHEN "users"."id" = 5 THEN 2
# WHEN "users"."id" = 3 THEN 3
# ELSE 4
# END ASC
WHERE句がなくなり、かわりに ORBER BY の CASE の最後に ELSE が追加されています
railtiesに関する変更です
bin/rails notes というコマンドがあります
ファイルの中から、「FIXME」「OPTIMIZE」「TODO」キーワードで始まるコメントを検索します
code:プルリクエストに記載されていたコマンドの実行結果.sh
$ bin/rails notes
app/controllers/posts_controller.rb:
* 9 TODO Move this logic to a concern app/models/post.rb:
* 2 TODO Refactor this validation 今回のプルリクエストでは bin/rails notes の結果をブラウザ上で確認できるようにしています
具体的には起動しているRailsアプリケーションの /rails/info/notes にアクセスしたらnotesの内容が表示されます
https://gyazo.com/1a924b0393d5315ea82c0278cd52b445